Gitweb mit git-http-backend auf Debian einrichten
Ziel ist es ein Git Repository über http mit git-http-backend (auch bekannt als smart http) einzurichten. In dieser Dokumentation habe ich $MYPROJECT
und $MYUSERNAME
als Platzhalter verwendet. Diese müssten dann natürlich mit den korrekten Namen gefüllt werden. Die Beispieldomain ist die Alt bekannte example.com.
Zuerst installieren wir die benötigten Pakete.
root:~# apt-get install git apache2 gitweb
Nun aktivieren wir die folgenden Apache Module und starten den Webserver neu.
root:~# a2enmod env alias fcgid auth_digest
root:~# service apache2 restart
Dann erstellen wir uns eine VHost Datei.
root:~# vi /etc/apache2/sites-available/gitweb.example.com.conf
<VirtualHost *:80>
ServerAdmin operations@example.com
ServerName gitweb.example.com
DocumentRoot /var/www/html
<IfModule mod_rewrite.c>
<IfModule mod_ssl.c>
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R=302,L]
</IfModule>
</IfModule>
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
# Global Settings
ServerAdmin operations@example.com
ServerName gitweb.example.com
DocumentRoot /usr/share/gitweb
# Directory Settings
<Directory /usr/share/gitweb>
Options +FollowSymLinks +ExecCGI
AddHandler cgi-script .cgi
DirectoryIndex gitweb.cgi
</Directory>
# Git configuration
# Enable git clone/push/fetch etc over http:
ScriptAliasMatch \
"(?x)^/(.*/(HEAD | \
info/refs | \
objects/(info/[^/]+ | \
[0-9a-f]{2}/[0-9a-f]{38} | \
pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
git-(upload|receive)-pack))$" \
/usr/lib/git-core/git-http-backend/$1
<IfModule mod_env.c>
SetEnv GIT_PROJECT_ROOT /var/lib/git
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
SetEnv GIT_SMART_HTTP=0
</IfModule>
<Location />
AuthType Digest
AuthName "Shared Git Repo"
AuthUserFile "custom.d/git-password.digest"
<RequireAll>
Require env IP_OFFICE
Require valid-user
</RequireAll>
</Location>
# Enable SSL
SSLEngine on
SSLCertificateFile custom.d/certs.d/wildcard.example.com.crt
SSLCACertificateFile custom.d/certs.d/AlphaSSLroot.crt
SSLCertificateKeyFile custom.d/certs.d/wildcard.example.com.key
SSLProtocol all -SSLv2 -SSLv3
# Logfile Settings
ErrorLog "${APACHE_LOG_DIR}/gitweb.example.com_err.log"
CustomLog "${APACHE_LOG_DIR}/gitweb.example.com_acc.log" common
LogLevel warn
</VirtualHost>
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Nun erstellen wir uns die Passwort Datei. den Schalter -c
benötigen wir nur bei dem ersten Benutzer. Existiert die Datei bereits, dann können wir den Schalter -c
weg lassen.
root:~# htdigest -c /etc/apache2/custom.d/git-password.digest "Shared Git Repo" ${MYUSERNAME}
Nun konfigurieren wir noch gitweb wie folgt.
root:~# cp /etc/gitweb.conf /etc/gitweb.conf.dist
root:~# echo -e '$projectroot = "/var/lib/git";' >/etc/gitweb.conf
root:~# echo '$git_temp = "/tmp";' >>/etc/gitweb.conf
Jetzt erstellen wir uns das Git Repository auf dem Server.
root:~# mkdir -p /var/lib/git
root:~# cd /var/lib/git
root:/var/lib/git# git init --bare --shared ${MYPROJECT}.git
root:/var/lib/git# echo "Git Repository ${MYPROJECT}" >${MYPROJECT}.git/description
root:/var/lib/git# echo -e "[gitweb]\n\towner = \"${MYUSERNAME}\"" >>${MYPROJECT}.git/config
root:/var/lib/git# cd ${MYPROJECT}.git/
root:/var/lib/git/${MYPROJECT}# git update-server-info
root:/var/lib/git# chown -R www-data.www-data /var/lib/git
root:/var/lib/git# cd
Nun aktivieren wir den Apache VHost und starten den Webserver neu. Eigentlich würde ein reload ausreichen, da wir in unserer Konfiguration SSL verwenden, muss der Apache neu gestartet werden.
root:~# a2ensite gitweb.example.com.conf
root:~# service apache2 restart
Achtung
Leeres Git Repository lässt sich nicht klonen Ein neues, leeres Repository, welches mit git init –bare erstellt wurde, kann man nicht klonen. Wir müssen auf dem Server erst eine Datei (z.B. README) im Repository commiten, bevor wir das Repository remote verwenden können.
Auf dem Server werden wir nun das neue Repository klonen und eine erste Datei (README) hinzufügen.
root:~# cd ~/tmp
root:~/tmp# git clone /var/lib/git/${MYPROJECT}.git
root:~/tmp# cd ${MYPROJECT}/
root:~/tmp/${MYPROJECT}# git status
root:~/tmp/${MYPROJECT}# touch README
root:~/tmp/${MYPROJECT}# git add .
root:~/tmp/${MYPROJECT}# git config --local user.name ${MYUSERNAME}
root:~/tmp/${MYPROJECT}# git config --local user.email ${MYUSERNAME}@example.com
root:~/tmp/${MYPROJECT}# git commit -m "initial commit"
root:~/tmp/${MYPROJECT}# git push origin master
root:~/tmp/${MYPROJECT}# cd
Nun ist unser Git Repository fertig. Das werden wir gleich auf unseren lokalen Rechner testen.
tux@earth:~$ cd ~/tmp
tux@earth:~/tmp$ git clone https://gitweb.example.com/${MYPROJECT}.git
tux@earth:~/tmp$ cd ${MYPROJECT}/
tux@earth:~/tmp/${MYPROJECT}$ echo "Hello Gitty" >README
tux@earth:~/tmp/${MYPROJECT}$ git add .
tux@earth:~/tmp/${MYPROJECT}$ git config --local user.name ${MYUSERNAME}
tux@earth:~/tmp/${MYPROJECT}$ git config --local user.email ${MYUSERNAME}@example.com
tux@earth:~/tmp/${MYPROJECT}$ git commit -m "some changes"
tux@earth:~/tmp/${MYPROJECT}$ git push origin master
Screenshot von Gitweb
Als Theme verwende ich ein eigenes Theme, welches man sich als gitweb-tuxnet24.tar.gz herrunter laden kann.
Als grafischen Git Client verwende ich SmartGit, was man sich von http://www.syntevo.com/smartgit/download herrunter laden kann. Der Client ist für Linux, Mac OS und Windows verfügbar und basiert auf Java.